package tech.waterism.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Data
@ApiModel(value = "预报数据Dto")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ForecastDataDto implements Serializable {

    /**
     * 时间
     * 实时水雨情库：st_pptn_r/st_rsvr_r/st_river_r---------tm
     */
    @ApiModelProperty("时间")
    private Date dt;

    /**
     * 实测/预热期降雨量
     * 实时水雨情库：st_pptn_r----------drp
     */
    @ApiModelProperty("实测/预热期降雨量")
    private Double rainReal;

    /**
     * 实测/预热期降雨量是否存在
     */
    @ApiModelProperty("实测/预热期降雨量是否存在")
    private Boolean rainRealIsExist;

    /**
     * 是否从前端输入降雨，前端输入则不修改为实测
     */
    @Schema(description = "是否从前端输入降雨")
    private Boolean rainForecastIsExist;

    /**
     * 预报/预见期降雨量
     * 多模式降雨预报：rainfall
     * 实时水雨情库：st_pptn_r----------drp
     */
    @ApiModelProperty("预报/预见期降雨量")
    private Double rainFore;

    /**
     * 预报/预见期降雨量是否存在
     */
    @ApiModelProperty("预报/预见期降雨量是否存在")
    private Boolean rainForeIsExist;

    /**
     * 降雨量
     * 产流模型/产汇流模型输入
     */
    @ApiModelProperty("降雨量")
    private Double rain;
    private Boolean rainIsExist;

    /**
     * 径流量
     * 产流模型输出/汇流模型输入
     * 洪水预报计算中间成果
     */
    @ApiModelProperty("径流量模拟结果")
    private Double runoffSim;

    /**
     * 分水源径流量
     * 产流模型输出/汇流模型输入
     * 洪水预报计算中间成果
     */
    @ApiModelProperty("分水源径流量")
    private Double[] rSim;

    /**
     * 实测/预热期流量数据
     * 若是输入单元：IF (artp = S) THEN (st_rsvr_r) ELSE (st_river_r) →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ st_rsvr_r-----otq;
     * st_river_r-----q
     * 若是输出单元：IF (outcd = IQ OR outcd = IZQ) THEN (st_rsvr_r) ELSE (st_river_r) →→→→→→→→→→→→→→ st_rsvr_r-----inq;
     * st_river_r-----q
     */
    @ApiModelProperty("实测/预热期流量数据")
    private Double qReal;
    private Boolean qRealIsExist;

    @ApiModelProperty("日均流量数据")
    private Double qDayReal;
    private Boolean qDayRealIsExist;

    /**
     * 预报/预见期流量数据
     */
    @ApiModelProperty("预报/预见期流量数据")
    private Double qFore;
    private Boolean qForeIsExist;

    /**
     * 预报/预见期流量数据 存放原始数据 方便刷新
     */
    @ApiModelProperty("预报/预见期流量数据 存放原始数据 方便刷新")
    private Double qForeOri;
    private Boolean qForeOriIsExist;

    /**
     * 流量输入
     * 实测流量 + 预报流量
     */
    @ApiModelProperty("流量输入")
    private Double q;
    private Boolean qIsExist;

    /**
     * 流量模拟结果 m<sup>3</sup>/s
     */
    @ApiModelProperty("流量模拟结果")
    private Double qSim;

    /**
     * 原始流量模拟结果 m<sup>3</sup>/s
     */
    @ApiModelProperty("原始流量模拟结果")
    private Double qSimOri;

    /**
     * 流量调洪结果
     */
    @ApiModelProperty("流量调洪结果")
    private Double qDispatch;

    /**
     * 天然流量
     */
    @ApiModelProperty("天然流量")
    private Double qNature;

    /**
     * 合成流量
     */
    @ApiModelProperty("合成流量")
    private Double qComb;

    /**
     * 实测/预热期水位数据
     * 若是输入单元：IF (artp = S) THEN (st_rsvr_r) ELSE (st_river_r) →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ st_rsvr_r-----r;
     * st_river_r-----z
     * 若是输出单元：IF (outcd = IQ OR outcd = IZQ) THEN (st_rsvr_r) ELSE (st_river_r) →→→→→→→→→→→→→→ st_rsvr_r-----r;
     * st_river_r-----z
     */
    @ApiModelProperty("实测/预热期水位数据")
    private Double zReal;
    private Boolean zRealIsExist;

    /**
     * 预测/预见期水位数据
     */
    @ApiModelProperty("预测/预见期水位数据")
    private Double zFore;
    private Boolean zForeIsExist;

    /**
     * 水位输入
     */
    @ApiModelProperty("水位")
    private Double z;
    private Boolean zIsExist;

    /**
     * 水位模拟结果
     */
    @ApiModelProperty("水位模拟结果")
    private Double zSim;

    /**
     * 水位调洪结果
     */
    @ApiModelProperty("水位调洪结果")
    private Double zDispatch;

    /**
     * 入流（水库调库模块使用）
     */
    @ApiModelProperty("入流（水库调库模块使用）")
    private Double qIn;
    private Boolean qInIsExist;

    @ApiModelProperty("日均入流")
    private Double qDayIn;
    private Boolean qDayInIsExist;

    /**
     * 水位（水库调库模块使用）
     */
    @ApiModelProperty("水位（水库调库模块使用）")
    private Double rz;

    private Boolean isOverFsltdZ;
    private Boolean rzIsExist;

    /**
     * 库容（水库调库模块使用）
     */
    @ApiModelProperty("库容（水库调库模块使用）")
    private Double v;

    /**
     * 出流（水库调度模块使用）
     */
    @ApiModelProperty("出流（水库调度模块使用）")
    private Double qOut;
    private Boolean qOutIsExist;

    @ApiModelProperty("日均出流量数据")
    private Double qDayOut;
    private Boolean qDayOutIsExist;

    /**
     * 按规则调度最大出流（水库调度模块使用）
     */
    @ApiModelProperty("按规则调度最大出流（水库调度模块使用）")
    private Double qOutMaxPrinciple;
    /**
     * 按规则调度最小出流（水库调度模块使用）
     */
    @ApiModelProperty("按规则调度最小出流（水库调度模块使用）")
    private Double qOutMinPrinciple;
    /**
     * 规则描述（水库调度模块使用）
     */
    @ApiModelProperty("规则描述（水库调度模块使用）")
    private String mannerPrinciple;

    /**
     * 状态列表
     */
    @ApiModelProperty(value = "状态列表")
    private List<FMStatusDto> statuses;

    /**
     * 分洪口行洪（蓄滞洪区）
     */
    @ApiModelProperty("分洪口行洪（蓄滞洪区）")
    private Double qPrep;
    private Boolean qPrepIsExist;

    /**
     * 分洪（蓄滞洪区）
     */
    @ApiModelProperty("分洪（蓄滞洪区）")
    private Double qDvr;
    private Boolean qDvrIsExist;

    /**
     * 排洪（蓄滞洪区）
     */
    @ApiModelProperty("排洪（蓄滞洪区）")
    private Double qDsc;
    private Boolean qDscIsExist;

    /**
     * 排洪口行洪（蓄滞洪区）
     */
    @ApiModelProperty("排洪口行洪（蓄滞洪区）")
    private Double qDown;
    private Boolean qDownIsExist;

    /**
     * 下游水位
     */
    @ApiModelProperty("下游水位")
    private Double zDown;
    private Boolean zDownIsExist;

    /**
     * 调度方式
     */
    @ApiModelProperty("调度方式")
    private Integer flowWay;

    /**
     * 蓄滞洪区是分洪阶段还是排洪阶段：
     * 1、分洪阶段
     * 2、排洪阶段
     */
    @ApiModelProperty("蓄滞洪区是分洪阶段还是排洪阶段")
    private Integer storeType;

    /**
     * 闸门说明
     */
    @ApiModelProperty("闸门说明")
    private String gateNote;

    /**
     * 记录设备开启个数的参数, 第一维为设备的开度状态, 第二维为设备的开启个数
     */
    @ApiModelProperty("记录设备开启个数的参数")
    private Integer[][] nUsedGates;

    /**
     * 按规则调度时，记录设备开启个数的参数, 第一维为设备的开度状态, 第二维为设备的开启个数（水库调度模块使用）
     */
    @ApiModelProperty("按规则调度时, 记录设备开启个数的参数")
    private Integer[][] nUsedGatesPrinciple;

    /**
     * 原始流量
     */
    @ApiModelProperty("原始流量")
    private Double qOri;

    /**
     * 流量（原始值）
     */
    @ApiModelProperty(value = "流量（原始值）")
    private Double qo;

    /**
     * 流量（原始值）是否存在
     */
    @ApiModelProperty(value = "流量（原始值）是否存在")
    private Boolean qOIsExist;
    /**
     * 出力
     */
    @ApiModelProperty(value = "出力（兆瓦）")
    private Double nPower;

    /**
     * 发电流量
     */
    @ApiModelProperty(value = "发电流量（立方米/秒）")
    private Double qPower;

    /**
     * 最大泄流能力
     */
    private Double qCapacity;
    /**
     * 是否用规则调度赋值
     */
    private Boolean usePrinciple;
    private String recordNo;
    private Boolean setFlag;

    /**
     * 分洪排洪阶段，0：未启用蓄滞洪区，1：开始分洪，2：开始排洪
     */
    private int iGrade;

    /**
     * 是否历史资料数据
     */
    private Boolean isHis;
}
